/*
 * ContaDeUtilizador.java
 *
 * Created on 14 de Maio de 2007, 17:51
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package pt.iscte.dcti.es.rhplus.sistema;

import java.security.NoSuchAlgorithmException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Hashtable;
import java.util.LinkedList;

import pt.iscte.dcti.es.rhplus.sistema.persistencia.AcessoBD;

/**
 * 
 * @author Gustavo Cabral
 * @author Helena Monteiro
 * @author Joao Catarino
 * @author Tiago Moreiras
 */
public class ContaDeUtilizador {

    /** Creates a new instance of Empresa */
    public ContaDeUtilizador(final String username, final String password, final String estado, final int id_pessoa, final String perfil) {

        this.username = username;
        this.password = password;
        this.estado = estado;
        this.id_pessoa = id_pessoa;
        this.perfil = perfil;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

    public String getEstado() {
        return estado;
    }

    public int getIdPessoa() {
        return id_pessoa;
    }

    public String getPerfil() {
        return perfil;
    }

    public static void alteraPerfil(final int id_pessoa, final String perfil) throws SQLException, ClassNotFoundException, InstantiationException,
            IllegalAccessException {

        // Consulta a BD
        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("altera_perfil_da_conta_de_utilizador");
        Hashtable<String, Object> dados_da_conta_de_utilizador = new Hashtable<String, Object>();
        dados_da_conta_de_utilizador.put("var_id_pessoa", id_pessoa);
        dados_da_conta_de_utilizador.put("var_perfil", perfil);
        acesso_bd.executaUpdate(qryName, dados_da_conta_de_utilizador);
        acesso_bd.fechaLigacao();
    }

    public static ContaDeUtilizador devolve(final String username) throws SQLException, ClassNotFoundException, InstantiationException,
            IllegalAccessException {

        // Consulta a BD
        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("devolver_conta_de_utilizador");
        Hashtable<String, Object> dados_da_conta_de_utilizador = new Hashtable<String, Object>();
        dados_da_conta_de_utilizador.put("var_username", username);
        ResultSet result_set = acesso_bd.executaSelect(qryName, dados_da_conta_de_utilizador);

        result_set.next();
        String var_username = result_set.getString("username");
        String var_password = result_set.getString("password");
        String var_estado = result_set.getString("estado");
        int var_id_pessoa = result_set.getInt("id_pessoa");
        String var_perfil = result_set.getString("perfil");

        ContaDeUtilizador conta_de_utilizador = new ContaDeUtilizador(var_username, var_password, var_estado, var_id_pessoa, var_perfil);

        acesso_bd.fechaLigacao();

        return conta_de_utilizador;
    }

    public static LinkedList<ContaDeUtilizador> devolveTodas() throws SQLException, ClassNotFoundException, InstantiationException,
            IllegalAccessException {
        // Consulta a BD
        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("devolver_contas_de_utilizador");
        ResultSet result_set = acesso_bd.executaSelect(qryName, null);

        LinkedList<ContaDeUtilizador> lista_de_contas_de_utilizador = new LinkedList<ContaDeUtilizador>();

        while (result_set.next()) {

            String var_username = result_set.getString("username");
            String var_password = result_set.getString("password");
            String var_estado = result_set.getString("estado");
            int var_id_pessoa = result_set.getInt("id_pessoa");
            String var_perfil = result_set.getString("perfil");

            ContaDeUtilizador conta_de_utilizador = new ContaDeUtilizador(var_username, var_password, var_estado, var_id_pessoa, var_perfil);

            lista_de_contas_de_utilizador.add(conta_de_utilizador);
        }

        acesso_bd.fechaLigacao();

        return lista_de_contas_de_utilizador;
    }

    public static boolean existeUsername(final String username) throws SQLException, ClassNotFoundException, InstantiationException,
            IllegalAccessException {
        // Consulta a BD
        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("devolver_conta_de_utilizador");
        Hashtable<String, Object> dados_da_conta_de_utilizador = new Hashtable<String, Object>();
        dados_da_conta_de_utilizador.put("var_username", username);
        ResultSet result_set = acesso_bd.executaSelect(qryName, dados_da_conta_de_utilizador);

        boolean existe_username = result_set.next();

        acesso_bd.fechaLigacao();

        if (existe_username) {
            return true;
        }

        return false;
    }

    public static LinkedList<String> devolveTodosOsUsernames() throws SQLException, ClassNotFoundException, InstantiationException,
            IllegalAccessException {
        // Consulta a BD
        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("devolver_usernames");
        ResultSet result_set = acesso_bd.executaSelect(qryName, null);

        LinkedList<String> lista_de_usernames = new LinkedList<String>();

        while (result_set.next()) {

            String username = result_set.getString("username");

            lista_de_usernames.add(username);
        }

        acesso_bd.fechaLigacao();

        return lista_de_usernames;
    }

    public static String devolvePassword(final String username) throws SQLException, ClassNotFoundException, InstantiationException,
            IllegalAccessException {
        // Consulta a BD
        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("devolver_password_de_utilizador");
        Hashtable<String, Object> dados_da_conta_de_utilizador = new Hashtable<String, Object>();
        dados_da_conta_de_utilizador.put("var_username", username);
        ResultSet result_set = acesso_bd.executaSelect(qryName, dados_da_conta_de_utilizador);

        result_set.next();
        // Devolve password encriptada (MD5 Hash)
        String password = result_set.getString("password");

        acesso_bd.fechaLigacao();

        return password;
    }

    public static int devolveIdPessoa(final String username) throws SQLException, ClassNotFoundException, InstantiationException,
            IllegalAccessException {
        // Consulta a BD
        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("devolver_id_pessoa_de_conta_de_utilizador");
        Hashtable<String, Object> dados_da_conta_de_utilizador = new Hashtable<String, Object>();
        dados_da_conta_de_utilizador.put("var_username", username);
        ResultSet result_set = acesso_bd.executaSelect(qryName, dados_da_conta_de_utilizador);

        result_set.next();
        int id_pessoa = result_set.getInt("id_pessoa");

        acesso_bd.fechaLigacao();

        return id_pessoa;
    }

    public static String devolveUsername(final int id_pessoa) throws SQLException, ClassNotFoundException, InstantiationException,
            IllegalAccessException {

        // Consulta a BD
        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("devolver_username_de_conta_de_utilizador");
        Hashtable<String, Object> dados_da_conta_de_utilizador = new Hashtable<String, Object>();
        dados_da_conta_de_utilizador.put("var_id_pessoa", id_pessoa);
        ResultSet result_set = acesso_bd.executaSelect(qryName, dados_da_conta_de_utilizador);

        result_set.next();
        String username = result_set.getString("username");

        acesso_bd.fechaLigacao();

        return username;
    }

    public static String devolvePerfil(final String username) throws SQLException, ClassNotFoundException, InstantiationException,
            IllegalAccessException {
        // Consulta a BD
        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("devolver_perfil_de_conta_de_utilizador");
        Hashtable<String, Object> dados_da_conta_de_utilizador = new Hashtable<String, Object>();
        dados_da_conta_de_utilizador.put("var_username", username);
        ResultSet result_set = acesso_bd.executaSelect(qryName, dados_da_conta_de_utilizador);

        result_set.next();
        String perfil = result_set.getString("perfil");

        acesso_bd.fechaLigacao();

        return perfil;
    }

    public static String devolvePerfil(final int id_pessoa) throws SQLException, ClassNotFoundException, InstantiationException,
            IllegalAccessException {
        // Consulta a BD
        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("devolver_perfil_de_conta_de_utilizador_por_id");
        Hashtable<String, Object> dados_da_conta_de_utilizador = new Hashtable<String, Object>();
        dados_da_conta_de_utilizador.put("var_id_pessoa", id_pessoa);
        ResultSet result_set = acesso_bd.executaSelect(qryName, dados_da_conta_de_utilizador);

        if (result_set.next()) {
            String perfil = result_set.getString("perfil");
            acesso_bd.fechaLigacao();
            return perfil;
        } else {
            return null;
        }
    }

    public static void alteraPassword(final String username, final String password) throws SQLException, ClassNotFoundException,
            InstantiationException, IllegalAccessException {
        // Consulta a BD
        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("alterar_password_de_utilizador");
        Hashtable<String, Object> dados_da_conta_de_utilizador = new Hashtable<String, Object>();
        dados_da_conta_de_utilizador.put("var_username", username);
        dados_da_conta_de_utilizador.put("var_password", password);
        acesso_bd.executaUpdate(qryName, dados_da_conta_de_utilizador);

        acesso_bd.fechaLigacao();
    }

    public static boolean eValida(final String username, final String password) throws SQLException, ClassNotFoundException, InstantiationException,
            IllegalAccessException, NoSuchAlgorithmException {

        String password_encriptada = Seguranca.converteParaMD5(password);

        // Consulta a BD
        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("efectuar_login");
        Hashtable<String, Object> dados_da_conta_de_utilizador = new Hashtable<String, Object>();
        dados_da_conta_de_utilizador.put("var_username", username);
        dados_da_conta_de_utilizador.put("var_password", password_encriptada);
        ResultSet result_set = acesso_bd.executaSelect(qryName, dados_da_conta_de_utilizador);

        boolean e_valida = result_set.next();

        acesso_bd.fechaLigacao();

        if (e_valida) {
            return true;
        }

        return false;
    }

    public static void activa(final String username) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        // Consulta a BD
        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("activar_conta_de_utilizador_por_username");
        Hashtable<String, Object> dados_da_conta_de_utilizador = new Hashtable<String, Object>();
        dados_da_conta_de_utilizador.put("var_username", username);
        acesso_bd.executaUpdate(qryName, dados_da_conta_de_utilizador);

        acesso_bd.fechaLigacao();
    }

    public static void desactiva(final String username) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        // Consulta a BD
        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("desactivar_conta_de_utilizador_por_username");
        Hashtable<String, Object> dados_da_conta_de_utilizador = new Hashtable<String, Object>();
        dados_da_conta_de_utilizador.put("var_username", username);
        acesso_bd.executaUpdate(qryName, dados_da_conta_de_utilizador);

        acesso_bd.fechaLigacao();
    }

    public static boolean estaActiva(final String username) throws SQLException, ClassNotFoundException, InstantiationException,
            IllegalAccessException {
        // Consulta a BD
        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("verificar_conta_de_utilizador_activa");
        Hashtable<String, Object> dados_da_conta_de_utilizador = new Hashtable<String, Object>();
        dados_da_conta_de_utilizador.put("var_username", username);
        ResultSet result_set = acesso_bd.executaSelect(qryName, dados_da_conta_de_utilizador);

        boolean esta_activa = result_set.next();

        acesso_bd.fechaLigacao();

        if (esta_activa) {
            return true;
        }

        return false;
    }

    public static void insere(final Hashtable<String, Object> dados_da_conta_de_utilizador) throws SQLException, ClassNotFoundException,
            InstantiationException, IllegalAccessException {

        // Inserir na base de dados - ContaDeUtilizador

        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("inserir_conta_de_utilizador");

        acesso_bd.executaUpdate(qryName, dados_da_conta_de_utilizador);
        acesso_bd.fechaLigacao();
    }

    public static void altera(final Hashtable<String, Object> dados_da_conta_de_utilizador) throws SQLException, ClassNotFoundException,
            InstantiationException, IllegalAccessException {

        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("alterar_conta_de_utilizador");
        acesso_bd.executaUpdate(qryName, dados_da_conta_de_utilizador);
        acesso_bd.fechaLigacao();

    }

    public static void remove(final String username) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
        String qryName = new String("remover_conta_de_utilizador");
        Hashtable<String, Object> dados_da_conta_de_utilizador = new Hashtable<String, Object>();
        dados_da_conta_de_utilizador.put("var_username", username);

        acesso_bd.executaUpdate(qryName, dados_da_conta_de_utilizador);
        acesso_bd.fechaLigacao();
    }

    public static void migraUtilizador(int id_pessoa,String username,String password) throws InstantiationException, ClassNotFoundException, SQLException, IllegalAccessException {
        AcessoBD acesso_bd = new AcessoBD();
        acesso_bd.carregaDriverEAbreLigacao();
       
        Hashtable<String, Object> dados = new Hashtable<String, Object>();
        
        String qryName = new String("remover_membro_do_agregado");
        dados.put("var_id_pessoa",id_pessoa);
        acesso_bd.executaUpdate(qryName, dados);
        
        qryName = new String("inserir_cliente_particular");
        dados.put("var_id_pessoa",id_pessoa);
        acesso_bd.executaUpdate(qryName, dados);

        acesso_bd.fechaLigacao();
    }

    public Hashtable<String, Object> toHashtable() {
        Hashtable<String, Object> dados_da_conta_de_utilizador = new Hashtable<String, Object>();

        dados_da_conta_de_utilizador.put("var_username", this.getUsername());
        dados_da_conta_de_utilizador.put("var_password", this.getPassword());
        dados_da_conta_de_utilizador.put("var_estado", this.getEstado());
        dados_da_conta_de_utilizador.put("var_id_pessoa", new Integer(this.getIdPessoa()));
        dados_da_conta_de_utilizador.put("var_perfil", this.getPerfil());

        return dados_da_conta_de_utilizador;
    }

    public void gravaParaBaseDeDados() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {

        ContaDeUtilizador.altera(this.toHashtable());

    }

    public String toString() {
        return username + ";" + password + ";" + estado + ";" + id_pessoa + ";" + perfil + ";";
    }
    private String username;
    private String password;
    private String estado;
    private int id_pessoa;
    private String perfil;
}
